
#include "TiposEnemigos.h"

TipoMono* GestionTiposEnemigos::tipoMono;
TipoBarril* GestionTiposEnemigos::tipoBarril;
TipoHongo* GestionTiposEnemigos::tipoHongo;
TipoTortuga* GestionTiposEnemigos::tipoTortuga;
TipoBomba* GestionTiposEnemigos::tipoBomba;

void GestionTiposEnemigos::Inicializar(vector <TipoEnemigo_y> tiposEnemigos) {
	
	for (unsigned int i=0; i<tiposEnemigos.size(); i++) {
		
		if (tiposEnemigos[i].tipo == "Mono")
			tipoMono = new TipoMono(tiposEnemigos[i]);
		else if (tiposEnemigos[i].tipo == "Barril")
			tipoBarril = new TipoBarril(tiposEnemigos[i]);
		else if (tiposEnemigos[i].tipo == "Hongo")
			tipoHongo = new TipoHongo(tiposEnemigos[i]);
		else if (tiposEnemigos[i].tipo == "Tortuga")
			tipoTortuga = new TipoTortuga(tiposEnemigos[i]);
		else if (tiposEnemigos[i].tipo == "Bomba")
			tipoBomba = new TipoBomba(tiposEnemigos[i]);
	}
}

void GestionTiposEnemigos::AsignarTipoEnemigo(Mono* mono) {
	
	tipoMono->AsignarAEnemigo(mono);
}

void GestionTiposEnemigos::AsignarTipoEnemigo(Barril* barril) {
	
	tipoBarril->AsignarAEnemigo(barril);
}

void GestionTiposEnemigos::AsignarTipoEnemigo(Hongo* hongo) {
	
	tipoHongo->AsignarAEnemigo(hongo);
}

void GestionTiposEnemigos::AsignarTipoEnemigo(Tortuga* tortuga) {
	
	tipoTortuga->AsignarAEnemigo(tortuga);
}

void GestionTiposEnemigos::AsignarTipoEnemigo(Bomba* bomba) {
	
	tipoBomba->AsignarAEnemigo(bomba);
}

vector<string> GestionTiposEnemigos::getListaTipos() {
	
	return make_vector<string>() << "Hongo" << "Mono" << "Tortuga" << "Barril" << "Bomba";
}

TipoMono::TipoMono(TipoEnemigo_y tipoEnemigo) {
	
	vector<Animacion_y> animaciones = tipoEnemigo.animaciones;	
	vector<string> descripcionParticulares = EstadoMono::descripcionAccionesParticulares;
	
	vector<infoAccion_t> v_accionesParticulares = AsignarParticulares(tipoEnemigo.ancho, tipoEnemigo.alto, descripcionParticulares, &animaciones);
	
	for (unsigned int i=0; i<descripcionParticulares.size(); i++) {
		accionesParticulares.push_back(v_accionesParticulares[i]);
	}
	
	Inicializar(tipoEnemigo.ancho, tipoEnemigo.alto, animaciones, ESPEJADA);
}

void TipoMono::AsignarAEnemigo(Mono* mono) {
	
	AsignarAObjeto(mono);
	mono->setPosicion(mono->getX(), mono->getY() - mono->getAlto());
	
	for (unsigned int k=0; k<accionesParticulares.size(); k++) {
		mono->addAccionParticular(accionesParticulares[k].idImagen, accionesParticulares[k].cuadros);
	}
}

TipoBarril::TipoBarril(TipoEnemigo_y tipoEnemigo) {
	
	vector<Animacion_y> animaciones = tipoEnemigo.animaciones;	
	vector<string> descripcionParticulares = EstadoBarril::descripcionAccionesParticulares;

	vector<infoAccion_t> v_accionesParticulares = AsignarParticulares(tipoEnemigo.ancho, tipoEnemigo.alto, descripcionParticulares, &animaciones);

	for (unsigned int i=0; i<descripcionParticulares.size(); i++) {
		accionesParticulares.push_back(v_accionesParticulares[i]);
	}
	
	Inicializar(tipoEnemigo.ancho, tipoEnemigo.alto, tipoEnemigo.animaciones, EstadoBarril::descripcionAcciones, tipoEnemigo.velocidad, tipoEnemigo.salto);
}

void TipoBarril::AsignarAEnemigo(Barril* barril) {

	AsignarAObjeto(barril);
	
	for (unsigned int k=0; k<accionesParticulares.size(); k++) {
		barril->addAccionParticular(accionesParticulares[k].idImagen, accionesParticulares[k].cuadros);
	}
}

TipoHongo::TipoHongo(TipoEnemigo_y tipoEnemigo) {
	
	vector<Animacion_y> animaciones = tipoEnemigo.animaciones;	
	vector<string> descripcionParticulares = EstadoHongo::descripcionAccionesParticulares;

	vector<infoAccion_t> v_accionesParticulares = AsignarParticulares(tipoEnemigo.ancho, tipoEnemigo.alto, descripcionParticulares, &animaciones);

	for (unsigned int i=0; i<descripcionParticulares.size(); i++) {
		accionesParticulares.push_back(v_accionesParticulares[i]);
	}

	Inicializar(tipoEnemigo.ancho, tipoEnemigo.alto, animaciones, EstadoHongo::descripcionAcciones, tipoEnemigo.velocidad, tipoEnemigo.salto);
}

void TipoHongo::AsignarAEnemigo(Hongo* hongo) {

	AsignarAObjeto(hongo);
	
	for (unsigned int k=0; k<accionesParticulares.size(); k++) {
		hongo->addAccionParticular(accionesParticulares[k].idImagen, accionesParticulares[k].cuadros);
	}
	
}

TipoTortuga::TipoTortuga(TipoEnemigo_y tipoEnemigo) {
	
	vector<Animacion_y> animaciones = tipoEnemigo.animaciones;	
	vector<string> descripcionParticulares = EstadoTortuga::descripcionAccionesParticulares;

	vector<infoAccion_t> v_accionesParticulares = AsignarParticulares(tipoEnemigo.ancho, tipoEnemigo.alto, descripcionParticulares, &animaciones);

	for (unsigned int i=0; i<descripcionParticulares.size(); i++) {
		accionesParticulares.push_back(v_accionesParticulares[i]);
	}

	Inicializar(tipoEnemigo.ancho, tipoEnemigo.alto, animaciones, EstadoTortuga::descripcionAcciones, tipoEnemigo.velocidad, tipoEnemigo.salto);
}

void TipoTortuga::AsignarAEnemigo(Tortuga* tortuga) {

	AsignarAObjeto(tortuga);
	
	for (unsigned int k=0; k<accionesParticulares.size(); k++) {
		tortuga->addAccionParticular(accionesParticulares[k].idImagen, accionesParticulares[k].cuadros);
	}
	
}

TipoBomba::TipoBomba(TipoEnemigo_y tipoEnemigo) {
	
	vector<Animacion_y> animaciones = tipoEnemigo.animaciones;	
	vector<string> descripcionParticulares = EstadoBomba::descripcionAccionesParticulares;

	vector<infoAccion_t> v_accionesParticulares = AsignarParticulares(tipoEnemigo.ancho, tipoEnemigo.alto, descripcionParticulares, &animaciones);

	for (unsigned int i=0; i<descripcionParticulares.size(); i++) {
		accionesParticulares.push_back(v_accionesParticulares[i]);
	}

	Inicializar(tipoEnemigo.ancho, tipoEnemigo.alto, animaciones, EstadoBomba::descripcionAcciones, tipoEnemigo.velocidad, tipoEnemigo.salto);
}

void TipoBomba::AsignarAEnemigo(Bomba* bomba) {

	AsignarAObjeto(bomba);
	
	for (unsigned int k=0; k<accionesParticulares.size(); k++) {
		bomba->addAccionParticular(accionesParticulares[k].idImagen, accionesParticulares[k].cuadros);
	}
	
}
